package sifeap.dal.ejb.reportes;

import java.sql.Connection;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import sifeap.bridge.VinculadosBridge;
import sifeap.dal.ejb.AbstractFacade;
import sifeap.entities.solicitudesauxilio.valueobject.SolicitudAuxilioVO;
import sifeap.entities.solicitudescredito.SolicitudCredito;
import sifeap.entities.solicitudescredito.valueobject.SolicitudCreditoVO;
import sifeap.wrappers.asociados.VinculadoWrapper;

@Stateless(name = "ReporteDAL")
public class ReporteDAL extends AbstractFacade<SolicitudCredito> implements ReporteDALLocal {

	@PersistenceContext(unitName = "sifeapPU")
	private EntityManager em;

	public ReporteDAL() {
		super(SolicitudCredito.class);
	}

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}

	/**
	 * Obtiene una conexion de la BD
	 */
	@Override
	public Connection obtenerConexion() {
		return getEntityManager().unwrap(java.sql.Connection.class);
	}

	/**
	 * Cierra una conexion de la BD
	 */
	@Override
	public void cerrarConexion(Connection conexion) {

		try {
			if (conexion != null) {
				conexion.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	@Override
	public String generarConsultaSolicitudesCredito(SolicitudCreditoVO solicitudCreditoVo, List<String> tiposCredito, List<String> estadosCredito) {
		// Query de asociados
		String consulta = this.obtenerConsulta("asociadosSolicitudesCredito");

		// Armo las condiciones
		String condiciones = "";

		// Filtros de fecha
		DateFormat formatter = null;
		if (solicitudCreditoVo.getFechaInicio() != null) {
			formatter = new SimpleDateFormat("yyyy-MM-dd");
			condiciones = condiciones.concat(" and solcred.fechasolicitud >= '".concat(formatter.format(solicitudCreditoVo.getFechaInicio())).concat(" 00:00:00'"));
		}

		if (solicitudCreditoVo.getFechaFin() != null) {
			if (formatter == null) {
				formatter = new SimpleDateFormat("yyyy-MM-dd");
			}
			condiciones = condiciones.concat(" and solcred.fechasolicitud <= '".concat(formatter.format(solicitudCreditoVo.getFechaFin())).concat(" 23:59:59'"));
		}

		// Filtros de tipos de credito
		if (tiposCredito != null && tiposCredito.size() > 0) {
			String id = "";
			for (String idTipoCredito : tiposCredito) {
				if (id.length() == 0) {
					// Es el primer id
					id = id.concat(idTipoCredito);
				} else {
					id = id.concat("," + idTipoCredito);
				}
			}
			condiciones = condiciones.concat(" and solcred.idtipocredito in (" + id + ")");
		}

		// Filtros de tipos de credito
		if (estadosCredito != null && estadosCredito.size() > 0) {
			String id = "";
			for (String idEstadoCredito : estadosCredito) {
				if (id.length() == 0) {
					// Es el primer id
					id = id.concat(idEstadoCredito);
				} else {
					id = id.concat("," + idEstadoCredito);
				}
			}
			condiciones = condiciones.concat(" and solcred.idestadocredito in (" + id + ")");
		}

		consulta = consulta.replace("-parametro_condiciones-", condiciones);

		Query query = em.createNativeQuery(consulta);
		List listaSolicitudes = query.getResultList();

		if (listaSolicitudes != null && listaSolicitudes.size() > 0) {
			// Procede a armar el query de la consulta
			VinculadoWrapper asociado;
			VinculadosBridge vinculadosBridge = new VinculadosBridge();

			consulta = this.obtenerConsulta("reporteSolicitudesCredito");

			String asociados = "";

			String cedula;
			for (int i = 0; i < listaSolicitudes.size(); i++) {
				cedula = (String) listaSolicitudes.get(i);
				asociado = vinculadosBridge.buscarPorCedula(cedula);
				asociados = asociados.concat("when '" + cedula + "' then " + "'" + ((asociado.getPrimerNombre() == null) ? "" : asociado.getPrimerNombre()) + " " + ((asociado.getSegundoNombre() == null) ? "" : " " + asociado.getSegundoNombre()) + " "
						+ ((asociado.getPrimerApellido() == null) ? "" : " " + asociado.getPrimerApellido()) + " " + ((asociado.getSegundoApellido() == null) ? "" : " " + asociado.getSegundoApellido()) + "' ");
			}

			asociados = "case trim(solcred.vincedula) \n" + asociados + "\nend";

			consulta = consulta.replace("-parametro_asociados-", asociados);
			consulta = consulta.replace("-parametro_condiciones-", condiciones);
		} else {
			consulta = null;
		}

		return consulta;
	}

	@Override
	public String generarConsultaSolicitudesAuxilio(SolicitudAuxilioVO solicitudAuxilioVo, List<String> tiposAuxilio, List<String> estadosAuxilio) {
		// Query de asociados
		String consulta = this.obtenerConsulta("asociadosSolicitudesAuxilio");

		// Armo las condiciones
		String condiciones = "";

		// Filtros de fecha
		DateFormat formatter = null;
		if (solicitudAuxilioVo.getFechaInicio() != null) {
			formatter = new SimpleDateFormat("yyyy-MM-dd");
			condiciones = condiciones.concat(" and solaux.fechasolicitud >= '".concat(formatter.format(solicitudAuxilioVo.getFechaInicio())).concat(" 00:00:00'"));
		}

		if (solicitudAuxilioVo.getFechaFin() != null) {
			if (formatter == null) {
				formatter = new SimpleDateFormat("yyyy-MM-dd");
			}
			condiciones = condiciones.concat(" and solaux.fechasolicitud <= '".concat(formatter.format(solicitudAuxilioVo.getFechaFin())).concat(" 23:59:59'"));
		}

		// Filtros de tipos de auxilio
		if (tiposAuxilio != null && tiposAuxilio.size() > 0) {
			String id = "";
			for (String idTipoAuxilio : tiposAuxilio) {
				if (id.length() == 0) {
					// Es el primer id
					id = id.concat(idTipoAuxilio);
				} else {
					id = id.concat("," + idTipoAuxilio);
				}
			}
			condiciones = condiciones.concat(" and solaux.idtipoauxilio in (" + id + ")");
		}

		// Filtros de tipos de auxilio
		if (estadosAuxilio != null && estadosAuxilio.size() > 0) {
			String id = "";
			for (String idEstadoAuxilio : estadosAuxilio) {
				if (id.length() == 0) {
					// Es el primer id
					id = id.concat(idEstadoAuxilio);
				} else {
					id = id.concat("," + idEstadoAuxilio);
				}
			}
			condiciones = condiciones.concat(" and solaux.idestadoauxilio in (" + id + ")");
		}

		consulta = consulta.replace("-parametro_condiciones-", condiciones);

		Query query = em.createNativeQuery(consulta);
		List listaSolicitudes = query.getResultList();

		if (listaSolicitudes != null && listaSolicitudes.size() > 0) {
			// Procede a armar el query de la consulta
			VinculadoWrapper asociado;
			VinculadosBridge vinculadosBridge = new VinculadosBridge();

			consulta = this.obtenerConsulta("reporteSolicitudesAuxilio");

			String asociados = "";

			String cedula;
			for (int i = 0; i < listaSolicitudes.size(); i++) {
				cedula = (String) listaSolicitudes.get(i);
				asociado = vinculadosBridge.buscarPorCedula(cedula);
				asociados = asociados.concat("when '" + cedula + "' then " + "'" + ((asociado.getPrimerNombre() == null) ? "" : asociado.getPrimerNombre()) + " " + ((asociado.getSegundoNombre() == null) ? "" : " " + asociado.getSegundoNombre()) + " "
						+ ((asociado.getPrimerApellido() == null) ? "" : " " + asociado.getPrimerApellido()) + " " + ((asociado.getSegundoApellido() == null) ? "" : " " + asociado.getSegundoApellido()) + "' ");
			}

			asociados = "case trim(solaux.vincedula) \n" + asociados + "\nend";

			consulta = consulta.replace("-parametro_asociados-", asociados);
			consulta = consulta.replace("-parametro_condiciones-", condiciones);
		} else {
			consulta = null;
		}

		return consulta;
	}

	@Override
	public String generarConsultaCantidadesCredito(SolicitudCreditoVO solicitudCreditoVo, List<String> tiposCredito, List<String> estadosCredito) {
		// Query de asociados
		String consulta = this.obtenerConsulta("reporteCantidadCreditos");

		// Armo las condiciones
		String condiciones = "";

		// Filtros de fecha
		DateFormat formatter = null;
		if (solicitudCreditoVo.getFechaInicio() != null) {
			formatter = new SimpleDateFormat("yyyy-MM-dd");
			condiciones = condiciones.concat(" and solcred.fechasolicitud >= '".concat(formatter.format(solicitudCreditoVo.getFechaInicio())).concat(" 00:00:00'"));
		}

		if (solicitudCreditoVo.getFechaFin() != null) {
			if (formatter == null) {
				formatter = new SimpleDateFormat("yyyy-MM-dd");
			}
			condiciones = condiciones.concat(" and solcred.fechasolicitud <= '".concat(formatter.format(solicitudCreditoVo.getFechaFin())).concat(" 23:59:59'"));
		}

		// Filtros de tipos de credito
		if (tiposCredito != null && tiposCredito.size() > 0) {
			String id = "";
			for (String idTipoCredito : tiposCredito) {
				if (id.length() == 0) {
					// Es el primer id
					id = id.concat(idTipoCredito);
				} else {
					id = id.concat("," + idTipoCredito);
				}
			}
			condiciones = condiciones.concat(" and solcred.idtipocredito in (" + id + ")");
		}

		// Filtros de tipos de credito
		if (estadosCredito != null && estadosCredito.size() > 0) {
			String id = "";
			for (String idEstadoCredito : estadosCredito) {
				if (id.length() == 0) {
					// Es el primer id
					id = id.concat(idEstadoCredito);
				} else {
					id = id.concat("," + idEstadoCredito);
				}
			}
			condiciones = condiciones.concat(" and solcred.idestadocredito in (" + id + ")");
		}

		consulta = consulta.replace("-parametro_condiciones-", condiciones);

		Query query = em.createNativeQuery(consulta);
		List listaSolicitudes = query.getResultList();

		if (!(listaSolicitudes != null && listaSolicitudes.size() > 0)) {
			consulta = null;
		}

		return consulta;
	}

	@Override
	public String generarConsultaCantidadesAuxilio(SolicitudAuxilioVO solicitudAuxilioVo, List<String> tiposAuxilio, List<String> estadosAuxilio) {
		// Query de asociados
		String consulta = this.obtenerConsulta("reporteCantidadAuxilios");

		// Armo las condiciones
		String condiciones = "";

		// Filtros de fecha
		DateFormat formatter = null;
		if (solicitudAuxilioVo.getFechaInicio() != null) {
			formatter = new SimpleDateFormat("yyyy-MM-dd");
			condiciones = condiciones.concat(" and solaux.fechasolicitud >= '".concat(formatter.format(solicitudAuxilioVo.getFechaInicio())).concat(" 00:00:00'"));
		}

		if (solicitudAuxilioVo.getFechaFin() != null) {
			if (formatter == null) {
				formatter = new SimpleDateFormat("yyyy-MM-dd");
			}
			condiciones = condiciones.concat(" and solaux.fechasolicitud <= '".concat(formatter.format(solicitudAuxilioVo.getFechaFin())).concat(" 23:59:59'"));
		}

		// Filtros de tipos de Auxilio
		if (tiposAuxilio != null && tiposAuxilio.size() > 0) {
			String id = "";
			for (String idTipoAuxilio : tiposAuxilio) {
				if (id.length() == 0) {
					// Es el primer id
					id = id.concat(idTipoAuxilio);
				} else {
					id = id.concat("," + idTipoAuxilio);
				}
			}
			condiciones = condiciones.concat(" and solaux.idtipoauxilio in (" + id + ")");
		}

		// Filtros de tipos de Auxilio
		if (estadosAuxilio != null && estadosAuxilio.size() > 0) {
			String id = "";
			for (String idEstadoAuxilio : estadosAuxilio) {
				if (id.length() == 0) {
					// Es el primer id
					id = id.concat(idEstadoAuxilio);
				} else {
					id = id.concat("," + idEstadoAuxilio);
				}
			}
			condiciones = condiciones.concat(" and solaux.idestadoauxilio in (" + id + ")");
		}

		consulta = consulta.replace("-parametro_condiciones-", condiciones);

		Query query = em.createNativeQuery(consulta);
		List listaSolicitudes = query.getResultList();

		if (!(listaSolicitudes != null && listaSolicitudes.size() > 0)) {
			consulta = null;
		}

		return consulta;
	}
}